package com.hsyt.pfc.support.util;

import org.apache.commons.lang3.math.NumberUtils;

import java.util.Date;

/**
 * @Description: 支付生成的业务编码
 * @ClassName: PayNoUtil.java
 * @Package: com.hsyt.pfc.support.util
 * @author wangze@hsyuntai.com
 * @date 2019年2月12日 下午2:45:51
 * @Copyright: 版权归  恒生芸泰网络  所有
 */
public class PayNoUtil {
    /**
     * PayNo默认长度
     */
    public static final int SIZE = 32;

    private PayNoUtil() {
    }

    /**
     * 支付编码生成
     * 日期（8: yyyyMMdd)+来源（2)+业务类型（2） + 支付渠道(2)+HOS_ID(6) + 服务器环境编码(1) + 订单号 （11）
     **/
    public static String generateNo(Date date, Integer source, Integer bizType, Integer channel, Long hosId, Integer serviceEnv, Long orderId) {
        StringBuilder sb = new StringBuilder(32);
        sb.append(DateUtil.getNumberDate(date));
        sb.append(String.format("%02d", (source == null ? 0 : source % 100)));
        sb.append(String.format("%02d", (bizType == null ? 0 : bizType % 100)));
        sb.append(String.format("%02d", (channel == null ? 0 : channel % 100)));
        sb.append(String.format("%06d", (hosId == null ? 0L : hosId % 1000000)));
        sb.append(String.format("%01d", (serviceEnv == null ? 0L : serviceEnv % 10)));
        sb.append(String.format("%011d", (orderId == null ? 0L : orderId % 100000000000L)));
        return sb.toString();
    }

    /**
     * 支付编码生成 无日期表示当天
     * 日期（8: yyyyMMdd)+来源（2)+业务类型（2） + 支付渠道(2)+HOS_ID(6) + 订单号 （12）
     **/
    public static String generateNo(Integer source, Integer bizType, Integer channel, Long hosId, Integer serviceEnv, Long orderId) {
        return generateNo(new Date(), source, bizType, channel, hosId, serviceEnv, orderId);
    }

    public static Date getDate(String payNo) {
        if (StringUtils.length(payNo) == SIZE) {
            String strDate = StringUtils.substring(payNo, 0, 8);
            return DateUtil.parseDate(strDate, DateUtil.FORMAT_yyyyMMdd);
        }
        return null;
    }

    public static Integer getSource(String payNo) {
        if (StringUtils.length(payNo) == SIZE) {
            return NumberUtils.toInt(StringUtils.substring(payNo, 8, 10), 0);
        }
        return null;
    }

    public static Integer getBizType(String payNo) {
        if (StringUtils.length(payNo) == SIZE) {
            return NumberUtils.toInt(StringUtils.substring(payNo, 10, 12), 0);
        }
        return null;
    }

    public static Integer getChannel(String payNo) {
        if (StringUtils.length(payNo) == SIZE) {
            return NumberUtils.toInt(StringUtils.substring(payNo, 12, 14), 0);
        }
        return null;
    }

    public static Long getHosId(String payNo) {
        if (StringUtils.length(payNo) == SIZE) {
            return NumberUtils.toLong(StringUtils.substring(payNo, 14, 20), 0);
        }
        return null;
    }

    public static Long getOrderId(String payNo) {
        if (StringUtils.length(payNo) == SIZE) {
            return NumberUtils.toLong(StringUtils.substring(payNo, 21), 0);
        }
        return null;
    }

    public static void main(String[] args) {
        Date date = new Date();
        Integer source = 112;
        Integer bizType = 113;
        Integer channel = 114;
        Long hosId = 115L;
        Long orderId = 11600001112L;
        String payNo = generateNo(date, source, bizType, channel, hosId, 9, orderId);
        System.out.println("generateNo ->" + payNo);
        System.out.println("getDate ->" + getDate(payNo));
        System.out.println("getSource ->" + getSource(payNo));
        System.out.println("getBizType ->" + getBizType(payNo));
        System.out.println("getChannel ->" + getChannel(payNo));
        System.out.println("getHosId ->" + getHosId(payNo));
        System.out.println("getOrderId ->" + getOrderId(payNo));
    }
}
